gtk-demo: Demo columnview sorting
authorMatthias Clasen <mclasen@redhat.com>
Sat, 14 Dec 2019 16:53:24 +0000 (11:53 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 30 May 2020 23:30:14 +0000 (19:30 -0400)
Enhance the settings demo to have a sortable column.

demos/gtk-demo/listview_settings.c
demos/gtk-demo/listview_settings.ui

index 8f91853e5a0cc63f4a0a9eaa45af6ad073b0964f..254313923b321b523f9ece5545a032e2170076eb 100644 (file)
@@ -2,7 +2,9 @@
  *
  * This demo shows a settings viewer for GSettings.
  *
- * It demonstrates how to implement support for trees with listview.
+ * It demonstrates how to implement support for trees with GtkListView.
+ *
+ * It also shows how to set up sorting for columns in a GtkColumnView.
  */
 
 #include <gtk/gtk.h>
@@ -131,12 +133,13 @@ static gboolean
 transform_settings_to_keys (GBinding     *binding,
                             const GValue *from_value,
                             GValue       *to_value,
-                            gpointer      unused)
+                            gpointer      data)
 {
   GtkTreeListRow *treelistrow;
   GSettings *settings;
   GSettingsSchema *schema;
   GListStore *store;
+  GtkSortListModel *sort_model;
   char **keys;
   guint i;
 
@@ -149,7 +152,6 @@ transform_settings_to_keys (GBinding     *binding,
   store = g_list_store_new (SETTINGS_TYPE_KEY);
 
   keys = g_settings_schema_list_keys (schema);
-  qsort (keys, g_strv_length (keys), sizeof (char *), strvcmp);
 
   for (i = 0; keys[i] != NULL; i++)
     {
@@ -164,7 +166,11 @@ transform_settings_to_keys (GBinding     *binding,
   g_settings_schema_unref (schema);
   g_object_unref (settings);
 
-  g_value_take_object (to_value, store);
+  sort_model = gtk_sort_list_model_new (G_LIST_MODEL (store),
+                                        gtk_column_view_get_sorter (GTK_COLUMN_VIEW (data)));
+  g_object_unref (store);
+
+  g_value_take_object (to_value, sort_model);
 
   return TRUE;
 }
@@ -229,6 +235,8 @@ do_listview_settings (GtkWidget *do_widget)
       GtkTreeListModel *treemodel;
       GtkSingleSelection *selection;
       GtkBuilder *builder;
+      GtkColumnViewColumn *name_column;
+      GtkSorter *sorter;
 
       g_type_ensure (SETTINGS_TYPE_KEY);
 
@@ -253,11 +261,16 @@ do_listview_settings (GtkWidget *do_widget)
                                    G_BINDING_SYNC_CREATE,
                                    transform_settings_to_keys,
                                    NULL,
-                                   NULL, NULL);
+                                   columnview, NULL);
       gtk_list_view_set_model (GTK_LIST_VIEW (listview), G_LIST_MODEL (selection));
       g_object_unref (selection);
       g_object_unref (treemodel);
       g_object_unref (model);
+
+      name_column = GTK_COLUMN_VIEW_COLUMN (gtk_builder_get_object (builder, "name_column"));
+      sorter = gtk_string_sorter_new (gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "name"));
+      gtk_column_view_column_set_sorter (name_column, sorter);
+      g_object_unref (sorter);
     }
 
   if (!gtk_widget_get_visible (window))
index 529adb47563e4e5e198baf2cd9edd0cc5a15acf7..2bc197f68fed79a4ae967887bdf14da8a6bae2dc 100644 (file)
@@ -2,10 +2,11 @@
 <interface>
   <object class="GtkWindow" id="window">
     <property name="title" translatable="yes">Settings</property>
-    <property name="default-width">600</property>
-    <property name="default-height">400</property>
+    <property name="default-width">640</property>
+    <property name="default-height">480</property>
     <child>
       <object class="GtkPaned">
+        <property name="position">300</property>
         <child>
           <object class="GtkScrolledWindow">
             <child>
@@ -47,7 +48,7 @@
             <child>
               <object class="GtkColumnView" id="columnview">
                 <child>
-                  <object class="GtkColumnViewColumn">
+                  <object class="GtkColumnViewColumn" id="name_column">
                     <property name="title">Name</property>
                     <property name="factory">
                       <object class="GtkBuilderListItemFactory">